package com.yingxin.yxerp.module.easypoi.excel.imports.task;

import org.springframework.data.redis.core.RedisTemplate;

public class ImportTaskExecutor {

    private RedisTemplate redisTemplate;

    private String taskType;

    private String tenantId;

    private ImportTask task;

    private ImportTaskResult result = new ImportTaskResult();

    public ImportTaskExecutor(RedisTemplate redisTemplate, String taskType, String tenantId, ImportTask task) {
        this.redisTemplate = redisTemplate;
        this.taskType = taskType;
        this.tenantId = tenantId;
        this.task = task;
    }

    public void execute() {
        // 检查导入可否进行
        checkImportTask(redisTemplate, taskType, tenantId);
        // 执行导入任务操作
        new Thread(() -> {
            this.result.setImportStatus(ImportTask.ImportStatus.IMPORTING);
            redisTemplate.opsForHash().put(ImportTask.IMPORT_TASK + ":" + tenantId, taskType, this.result);
            try {
                task.task(this.result);
            } catch (Exception e) {
                this.result.setImportStatus(ImportTask.ImportStatus.FAIL);
                redisTemplate.opsForHash().put(ImportTask.IMPORT_TASK + ":" + tenantId, taskType, this.result);
                throw e;
            }
            this.result.setImportStatus(ImportTask.ImportStatus.SUCCESS);
            redisTemplate.opsForHash().put(ImportTask.IMPORT_TASK + ":" + tenantId, taskType, this.result);
        }).start();
    }

    public static void checkImportTask(RedisTemplate redisTemplate, String taskType, String tenantId) {
//        // 判断一个租户只有一个导入任务（后期可能取消）
//        List<ImportTaskResult> importTaskList = redisTemplate.opsForHash().values(ImportTask.IMPORT_TASK + ":" + tenantId);
//        if (CollectionUtil.isNotEmpty(importTaskList)) {
//            for (ImportTaskResult item : importTaskList) {
//                if (item != null && item.getImportStatus().equals(ImportTask.ImportStatus.IMPORTING)) {
//                    throw new BusinessException(BaseConstant.BaseCode.IMPORT_TASK_ING);
//                }
//            }
//        }
//        // 判断当前导入类型任务是否进行中
//        ImportTaskResult importing = getImportTaskResult(redisTemplate, taskType, tenantId);
//        if (importing != null && importing.getImportStatus().equals(ImportTask.ImportStatus.IMPORTING)) {
//            throw new BusinessException(BaseConstant.BaseCode.IMPORT_TASK_ING);
//        }
    }

    public static ImportTaskResult getImportTaskResult(RedisTemplate redisTemplate, String taskType, String tenantId) {
        return (ImportTaskResult) redisTemplate.opsForHash().get(ImportTask.IMPORT_TASK + ":" + tenantId, taskType);
    }
}
